/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Sjakk;

import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JPanel;
import javax.swing.JFrame;
import java.awt.GridLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JTextArea;

/**
 * Programmeringsprosjekt 2011 / Gruppe 2
 * @author Fjogen (Vegard Fjogstad)
 */

public class guiBrett extends JFrame implements ActionListener{
    JPanel vindu;
    JFrame ramme;
    ruteKnapp[][] knapper;
    Brett brett;
    Brikke brikke;
    boolean brikkeValgt;
    String farge;
    JTextArea konsoll;
    public guiBrett(){
        //GridLayout gridLayout = new GridLayout(0, 8);
        GridBagLayout layout = new GridBagLayout();
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.weightx = 0;
        ramme = new JFrame("Sjakk - Programmeringsprosjekt");
        vindu = new JPanel();
        vindu.setLayout(layout);
        ramme.add(vindu);
        ramme.setVisible(true);
        ramme.pack();
        ramme.setDefaultCloseOperation(EXIT_ON_CLOSE);
        ramme.setIconImage(Toolkit.getDefaultToolkit().getImage("img/sKonge.png"));
        JMenuBar menuBar = new JMenuBar();
        JMenu fil = new JMenu("Fil");
        menuBar.add(fil);
        JMenuItem lagre = new JMenuItem("Lagre spill.");
        JMenuItem laste = new JMenuItem("Hente inn spill.");
        lagre.addActionListener(this);
        laste.addActionListener(this);
        fil.add(lagre);
        fil.add(laste);
        ramme.setJMenuBar(menuBar);
        knapper = new ruteKnapp[8][8];
        brett = new Brett();
        brett.resetBrett();
        brikkeValgt = false;
        for(int i=0;i<8;i++){
            for(int j=0;j<8;j++){
                gbc.gridx = j;
                gbc.gridy = i;
                gbc.ipadx = 0;
                gbc.ipady = 0;
                knapper[i][j] = new ruteKnapp(i, j);
                layout.setConstraints(knapper[i][j], gbc);
                vindu.add(knapper[i][j]);
                knapper[i][j].setPreferredSize(new Dimension(71, 71));
                knapper[i][j].addActionListener(this);
            }
        }
        konsoll = new JTextArea("Flyttelogg!");
        konsoll.setEditable(false);
        gbc.gridx = 0;
        gbc.gridy = 9;
        gbc.gridwidth = 8;
        layout.setConstraints(konsoll, gbc);
        vindu.add(konsoll);
    }
    public void tegnBrett(){
        Brikke[][] brettInfo = brett.getBrett();
        for(int i=0;i<8;i++){
            for(int j=0;j<8;j++){
                if(brettInfo[i][j]!=null){
                    knapper[i][j].setIcon(brettInfo[i][j].getIcon());
                } else {
                    knapper[i][j].setIcon(null);
                }
            }
        }
        ramme.pack();
    }
    public void fargeleggBrett(){
        for(int i=0;i<8;i++){
            for(int j=0;j<8;j++){
                /*
                 * Metoden fargelegger sort i de ruter hvor både i og j enten gir eller ikke gir rest..
                 * Hvit gjelder kun når bare en av variablene gir rest, ikke begge.
                 */
                if(i%2 ==0 && j%2 ==0){
                    knapper[i][j].setBackground(Color.DARK_GRAY);
                } else if(i%2 !=0 && j%2 !=0) {
                    knapper[i][j].setBackground(Color.DARK_GRAY);
                } else {
                    knapper[i][j].setBackground(Color.LIGHT_GRAY);
                }
            }
        }
    }
    public void fargeleggLovligeFlytt(int[][] lovligeFlytt){
        for(int i=0;i<lovligeFlytt.length;i++){
            if(lovligeFlytt[i][0]!=10 && lovligeFlytt[i][1]!=10){
                knapper[lovligeFlytt[i][0]][lovligeFlytt[i][1]].setBackground(Color.YELLOW);
            } else if(lovligeFlytt[i][0]==11 && lovligeFlytt[i][1]==11){
                knapper[lovligeFlytt[i][0]][lovligeFlytt[i][1]].setBackground(Color.RED);
            }
        }
    }
    public void actionPerformed(ActionEvent e){
        ruteKnapp knapp = new ruteKnapp(0, 0);
        if(e.getSource() instanceof ruteKnapp){
            knapp = (ruteKnapp)e.getSource();
        }
        int posX = knapp.getPosX();
        int posY = knapp.getPosY();
        if(e.getActionCommand().equals("Lagre spill.")){
            SaveLoad lagre = new SaveLoad();
            try {
                lagre.save("LagretSpill", brett);
                JOptionPane.showMessageDialog(null, "HERREGUD FOR EN LAGRINGSFEATURE!");
            } catch (Exception ex) {
                Logger.getLogger(guiBrett.class.getName()).log(Level.SEVERE, null, ex);
            }
        } else if(e.getActionCommand().equals("Hente inn spill.")){
            SaveLoad laste = new SaveLoad();
            try {
                brett.setBrett(laste.load("LagretSpill"));
                tegnBrett();
            } catch (Exception ex) {
                Logger.getLogger(guiBrett.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        if(!brikkeValgt){
            if(brett.getBrikke(posX, posY)!=null){
                brikke = brett.getBrikke(posX, posY);
                farge = brikke.getFarge();
                int[][] lovligeFlytt = brett.getLovligeFlytt(brikke);
                fargeleggLovligeFlytt(lovligeFlytt);
                for(int i=0;i<lovligeFlytt.length;i++){
                    /*
                     * Sjekker om brikken har noen lovlige flytt i det hele tatt før den aktiverer knapp 2.
                     */
                    if(lovligeFlytt[i][0]!=10 && lovligeFlytt[i][1]!=10){
                        brikkeValgt = true;
                    }
                }
            } else {
                System.out.println("Tom rute.");
            }
        } else if(brikkeValgt){
            brett.flyttBrikke(brikke, posX, posY, brett.getLovligeFlytt(brikke));
            brikkeValgt = false;
            konsoll.setText(brett.toString());
            fargeleggBrett();
            tegnBrett();
        }
    }
    public static void main(String[] args) {
        guiBrett test = new guiBrett();
        test.tegnBrett();
        test.fargeleggBrett();
    }
}

